package models

import (
	"fmt"
	_ "github.com/lib/pq" //postgres driver.
	"github.com/xormplus/xorm"
	"os"
	"redis_global_key/config"
	"time"
)

type Database struct {
	M1 *xorm.Engine
}

var DB *Database

func (db *Database) Init() {
	DB = &Database{
		M1: initM1(),
	}
}

func initM1() *xorm.Engine {
	return openPostgresDB("")
}

func openPostgresDB(name string) *xorm.Engine {
	var cfg config.DBCfg
	if name == "" {
		cfg = config.Conf.DB["default"]
	} else {
		cfg = config.Conf.DB[name]
	}
	conn := cfg.Addr
	db, err := xorm.NewEngine("postgres", conn)
	if err != nil {
		_, _ = fmt.Fprintln(os.Stderr, "init postgres error::", err.Error())
		os.Exit(1)
	}
	// set for db connection
	setupDB(db, cfg)
	return db
}

func setupDB(eg *xorm.Engine, cfg config.DBCfg) {
	// 用于设置最大打开的连接数，默认值为0表示不限制.设置最大的连接数，可以避免并发太高导致连接mysql出现too many connections的错误。
	eg.SetMaxOpenConns(cfg.MaxOpenConns)
	// 用于设置闲置的连接数.设置闲置的连接数则当开启的一个连接使用完成后可以放在池里等候下一次使用。
	eg.SetMaxIdleConns(cfg.MaxIdleConns)
	// 链接的最长时间
	eg.SetConnMaxLifetime(time.Second * time.Duration(cfg.ConnMaxLifeTime))
}
